home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / PowerPC / vbcc / Examples / exchandler / exchandler.c next >
Encoding:
C/C++ Source or Header  |  1998-05-24  |  1.6 KB  |  69 lines

  1. /*
  2. ** WarpOS exception handler demo
  3. */
  4.  
  5. #include <stdio.h>
  6.  
  7. #include <utility/tagitem.h>
  8. #include <powerpc/powerpc.h>
  9. #include <powerpc/tasksPPC.h>
  10. #include <clib/powerpc_protos.h>
  11.  
  12.  
  13. static ULONG sigmask;
  14. static struct TaskPPC *mytask;
  15. static struct EXCContext exc;
  16.  
  17.  
  18. ULONG getR2(void) = "\tmr\tr3,r2";
  19. static ULONG exception_handler(struct EXCContext *);
  20.  
  21.  
  22.  
  23. main()
  24. {
  25.   struct TagItem ehtags[] = {
  26.     { EXCATTR_CODE,(ULONG)exception_handler },
  27.     { EXCATTR_DATA,0 },
  28.     { EXCATTR_EXCID,EXCF_MCHECK | EXCF_DACCESS | EXCF_IACCESS | 
  29.                     EXCF_PROGRAM | EXCF_ALIGN },
  30.     { EXCATTR_FLAGS,EXCF_GLOBAL | EXCF_LARGECONTEXT },
  31.     { EXCATTR_NAME,(ULONG)"Test-Handler" },
  32.     { TAG_DONE }
  33.   };
  34.   LONG sig;
  35.   void *xlock;
  36.   int i;
  37.  
  38.   ehtags[1].ti_Data = getR2();
  39.   mytask = FindTaskPPC(NULL);
  40.   if ((sig = AllocSignalPPC(-1)) < 0)
  41.     exit(10);
  42.   sigmask = 1<<sig;
  43.  
  44.   if (xlock = SetExcHandler(ehtags)) {
  45.     printf("Exception handler installed.\n\n");
  46.     WaitPPC(sigmask);
  47.     RemExcHandler(xlock);
  48.  
  49.     printf("Exception type %ld occured at PC=0x%08lx!\nGPR-dump:\n",
  50.            exc.ec_ExcID,exc.ec_UPC.ec_PC);
  51.     for (i=0; i<32; i+=8)
  52.       printf("GPR%02d-%02d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx "
  53.              "%08lx\n",i,i+7,exc.ec_GPR[i],exc.ec_GPR[i+1],exc.ec_GPR[i+2],
  54.              exc.ec_GPR[i+3],exc.ec_GPR[i+4],exc.ec_GPR[i+5],
  55.              exc.ec_GPR[i+6],exc.ec_GPR[i+7]);
  56.   }
  57.  
  58.   FreeSignalPPC(sig);
  59.   exit(0);
  60. }
  61.  
  62.  
  63. static ULONG exception_handler(struct EXCContext *ec)
  64. {
  65.   memcpy(&exc,ec,sizeof(struct EXCContext));
  66.   SignalPPC(mytask,sigmask);
  67.   return (EXCRETURN_NORMAL);
  68. }
  69.